package com.example.controller;

import io.swagger.annotations.Api;
import lombok.Builder;
import lombok.Data;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

/**
 * Validated 直接放在该模型前，该模型内部的字段才会被校验
 * 只有将@Validated放在类上时，参数前的约束才会生效
 */

/**
 * Validated：可以用在类型、方法和方法参数上。但是不能用在成员属性（字段）上
 * Valid：    可以用在 方法、构造函数、方法参数和成员属性（字段）上
 */
@Api(description = "验证参数")
@RestController
@RequestMapping("/validate")
//@Validated
public class ValidateController {

    /**
     * 1.方法前的Valid用于验证返回对象
     * 2.Valid 需和类上的Validated联合使用
     */
    @PostMapping("/fieldNull")
    public @Valid ResponceDto validateFieldNull(@NotNull(message = "str不能为空") String str){
        System.out.println(str);
        return ResponceDto.builder().id(1).build();

    }
    @PostMapping("/fieldEmpty")
    public void validateFieldEmpty(@NotEmpty(message = "str不能为空") String str){
        System.out.println(str);
    }

    /**
     * 参数对象前的Valid,不能换成Validated,现在还不知道为什么
     */
    @PostMapping("/validateObject")
    public void validateObject(@Valid @NotNull QueryDto dto){
        System.out.println(dto);
    }

    @Data
    public class QueryDto{
        @NotNull(message = "id不能不空")
        private Integer id;
        @NotBlank(message = "name不能不空")
        private String name;
    }

    @Data
    @Builder
    static class ResponceDto{
        @NotNull(message = "id不能不空")
        private Integer id;
        @NotBlank(message = "name不能不空")
        private String name;
    }
}
